package com.heyou.assistant;


import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
import dev.langchain4j.service.spring.AiService;
import dev.langchain4j.service.spring.AiServiceWiringMode;

/**
 * 隔离聊天记忆
 * 1、系统提示词
 * @SystemMessage 设定角色，塑造AI助手的专业身份，明确助手的能力范围
 * @SystemMessage 的内容将在后台转换为 SystemMessage 对象，并与 UserMessage 一起发送给大语言模型（LLM）。
 * SystemMessaged的内容只会发送给大模型一次。
 * 若修改 SystemMessage 的内容，新的 SystemMessage会被发送给大模型，之前的聊天记忆会失效。
 * <p>
 * 2、用户提示词
 * @UserMessage 获取用户输入
 *
 *
 */
@AiService(
        wiringMode = AiServiceWiringMode.EXPLICIT,
        chatModel = "qwenChatModel",
        chatMemoryProvider = "mongoChatMemoryProvider",
        tools = {"calculatorTools"}
)
public interface SeparateChatAssistant {
    /**
     * 分离聊天记忆
     *
     * @param memoryId    聊天ID
     * @param userMessage 聊天信息
     * @return 响应信息
     * @SystemMessage 设定角色，塑造AI助手的专业身份，明确助手的能力范围
     */
    @SystemMessage("你是我的好朋友，请用东北话回答问题。今天是：{{current_date}}")
    String chat(@MemoryId Long memoryId, @UserMessage String userMessage);

    /**
     * 分离聊天记忆
     *
     * @param memoryId    聊天ID
     * @param userMessage 聊天信息
     * @return 响应信息
     * @SystemMessage 设定角色，塑造AI助手的专业身份，明确助手的能力范围
     */
    @SystemMessage(fromResource = "simple-prompt-template.txt")
    String chatBy(@MemoryId Long memoryId, @UserMessage String userMessage);

    /**
     *
     * @param memoryId 聊天ID
     * @param userMessage 聊天信息
     * @return 响应信息
     */
    @UserMessage("你是我的好朋友，请使用粤语回答问题，适当添加表情符号。{{message}}")
    String chatOne(@MemoryId Long memoryId, @V("message") String userMessage);

    /**
     *
     * @param memoryId 聊天ID
     * @param userMessage 聊天信息
     * @param username 用户名称
     * @param age 年龄
     * @return 响应信息
     */
    @SystemMessage(fromResource = "multi-prompt-template.txt")
    String chatTwo(@MemoryId Long memoryId,
                   @UserMessage String userMessage,
                   @V("username") String username,
                   @V("age") int age);
}
